package org.xx.sipahi.jpa;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;

import static javax.persistence.GenerationType.SEQUENCE;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;
import static org.xx.armory.commons.SysUtils.copyDate;

@Entity(name = "presentation")
@Table(name = "CM_PRESENTATION")
@SequenceGenerator(name = "CN_ID",
                   sequenceName = "CN_ID",
                   allocationSize = 1)
@Access(AccessType.PROPERTY)
public class PresentationPO
        implements Serializable {
    private static final long serialVersionUID = 1L;

    private long id;

    private String title;

    private CategoryPO category;

    private String keywords;

    private String brief;

    private String creator;

    private Date createTime;

    private String updater;

    private Date lastModifiedTime;

    private int status;

    private String content;

    /**
     * 获取介绍的ID。
     *
     * @return 介绍ID。
     */
    @Id
    @GeneratedValue(strategy = SEQUENCE,
                    generator = "CN_ID")
    @Column(name = "CP_ID")
    public long getId() {
        return this.id;
    }

    /**
     * 设置介绍的ID。
     *
     * @param id
     *         介绍ID。
     */
    public void setId(
            long id
    ) {
        this.id = id;
    }

    /**
     * 获取介绍的标题。
     *
     * @return 介绍的标题。
     */
    @Column(name = "TITLE",
            nullable = false)
    public String getTitle() {
        return this.title;
    }

    /**
     * 设置介绍的标题。
     *
     * @param title
     *         介绍的标题。
     */
    public void setTitle(
            String title
    ) {
        this.title = trimToEmpty(title);
    }

    /**
     * 获取栏目的栏目。
     *
     * @return 栏目的栏目。
     */
    @ManyToOne(cascade = CascadeType.DETACH,
               fetch = FetchType.LAZY)
    @JoinColumn(name = "CATEGORY",
                nullable = false)
    public CategoryPO getCategory() {
        return this.category;
    }

    /**
     * 设置栏目的栏目。
     *
     * @param category
     *         栏目的栏目。
     */
    public void setCategory(
            CategoryPO category
    ) {
        this.category = category;
    }

    /**
     * 获取介绍的关键字。
     *
     * @return 介绍的关键字。
     */
    @Column(name = "KEYWORDS")
    public String getKeywords() {
        return this.keywords;
    }

    /**
     * 设置介绍的关键字。
     *
     * @param keywords
     *         介绍的关键字。
     */
    public void setKeywords(
            String keywords
    ) {
        this.keywords = trimToEmpty(keywords);
    }

    /**
     * 获取介绍的摘要。
     *
     * @return 介绍的摘要。
     */
    @Column(name = "BRIEF")
    public String getBrief() {
        return this.brief;
    }

    /**
     * 设置介绍的摘要。
     *
     * @param brief
     *         介绍的摘要。
     */
    public void setBrief(
            String brief
    ) {
        this.brief = trimToEmpty(brief);
    }

    /**
     * 获取介绍的创建人。
     *
     * @return 介绍的创建人。
     */
    @Column(name = "CREATOR",
            nullable = false,
            updatable = false)
    public String getCreator() {
        return this.creator;
    }

    /**
     * 设置介绍的创建人。
     *
     * @param creator
     *         介绍的创建人。
     */
    public void setCreator(
            String creator
    ) {
        this.creator = trimToEmpty(creator);
    }

    /**
     * 获取创建时间。
     *
     * @return 创建时间。
     */
    @Column(name = "CREATE_TIME",
            nullable = false,
            updatable = false)
    public Date getCreateTime() {
        return copyDate(this.createTime);
    }

    /**
     * 设置创建时间。
     *
     * @param createTime
     *         创建时间。
     */
    public void setCreateTime(
            Date createTime
    ) {
        this.createTime = copyDate(createTime);
    }

    /**
     * 获取介绍的最后修改人。
     *
     * @return 介绍的最后修改人。
     */
    @Column(name = "UPDATER",
            nullable = false)
    public String getUpdater() {
        return this.updater;
    }

    /**
     * 设置介绍的最后修改人。
     *
     * @param updater
     *         介绍的最后修改人。
     */
    public void setUpdater(
            String updater
    ) {
        this.updater = trimToEmpty(updater);
    }

    /**
     * 获取介绍的最后修改时间。
     *
     * @return 介绍的最后修改时间。
     */
    @Column(name = "UPDATE_TIME",
            nullable = false)
    public Date getLastModifiedTime() {
        return copyDate(this.lastModifiedTime);
    }

    /**
     * 设置介绍的最后修改时间。
     *
     * @param lastModifiedTime
     *         介绍的最后修改时间。
     */
    public void setLastModifiedTime(
            Date lastModifiedTime
    ) {
        this.lastModifiedTime = copyDate(lastModifiedTime);
    }

    /**
     * 获取介绍状态。
     *
     * @return 介绍状态。
     */
    @Column(name = "STATUS",
            nullable = false)
    public int getStatus() {
        return this.status;
    }

    /**
     * 设置介绍状态。
     *
     * @param status
     *         介绍状态。
     */
    public void setStatus(
            int status
    ) {
        this.status = status;
    }

    @Override
    public int hashCode() {
        return Objects.hash(this.id);
    }

    @Override
    public boolean equals(
            Object obj
    ) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof PresentationPO)) {
            return false;
        }
        final var other = (PresentationPO) obj;
        return this.id == other.id;
    }


}
